/**
 * 1. 将data中的属性挂载到vm实例上面
 *      Object.defineProperty(obj,key,{get(){},set(){})
 * 
 * 2. todoMvc案例 
 *      将前两天学习的内容，指令 事件等等串在一块 
 * 
 * 3. v-model的三个修饰符 
 *      .lazy      触发时机:   1. 回车  2. 失去焦点 
 *        本来v-model的事件是input,也就是说只要有字符输入就会触发,加了lazy修饰符之后，就将input事件变成了change事件(回车或是失去焦点时才会触发)
 *      .number   内部是使用parseFloat将数据转换成数字,如果能转就转，不能转就显示原始的值
 *      .trim     和之前的trim()方法一样,都是去掉字符串的首尾空格
 * 
 * 4. 计算属性
 *      依赖于data中原来的值进行处理后的数据
 *      如果data中的数据发生了，变化这个时候，才会重新进行计算
 *      而且会进行缓存数据，效率高
 * 
 *      简单写法:
 *        内部是一个方法的名字：但是使用的时候，是像data中的属性名一样来使用,直接在插值表达式的位置 写方法的名称 
 *        简单写法，可以直接在方法名内，写对应的业务逻辑 在插值表达式内，只是用来渲染
 *        方法或是函数的内部，包裹着很多要执行或是待执行的代码
 * 
 *       完整写法： 是带get与set两个方法
 *         如果仅仅是渲染对应的结果 ，则会执行get中的代码逻辑
 *         如果要是设置对应的值，则会执行set中的代码逻辑
 *         相当于是一个双向的，既有使用(渲染)  也有重新设置
 * 
 * 5. 侦听属性 
 *      当data中的数据发生了变化的时候，我们可以使用watch对相应的数据进行侦听
 *        
 *      两种写法：
 *        第1种是简单侦听: 适合侦听简单数据类型 string  number  boolean  
 *        第2种是深度侦听: 适合侦听复杂数据类型  比如对象 
 *            deep:true  要开启深度侦听，即使对象的地址没有发生变化，但是只要属性值变化也会立即执行
 *            immediate: true 立即开启侦听 
 *    
 */